import pandas as pd
import os
import matplotlib.pyplot as plt

def main():
    if not os.path.exists('images'):
        os.makedirs('images')
    df = pd.read_csv("csv/dalian_weather_2022-2024_full.csv")

    # 数据清洗
    df['日期'] = pd.to_datetime(df['日期'])
    df['月份'] = df['日期'].dt.month
    df['年份'] = df['日期'].dt.year

    # 计算每月平均气温
    monthly_avg = df.groupby(['月份', '年份']).agg({
        '最高气温': 'mean',
        '最低气温': 'mean'
    }).reset_index()

    # 计算三年同月份的平均值
    monthly_avg_3year = monthly_avg.groupby('月份').agg({
        '最高气温': 'mean',
        '最低气温': 'mean'
    }).reset_index()

    # 准备绘图数据
    months = monthly_avg_3year['月份']
    avg_high = monthly_avg_3year['最高气温']
    avg_low = monthly_avg_3year['最低气温']

    # 设置中文显示
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False

    # 创建折线图
    plt.figure(figsize=(12, 6))

    # 绘制折线
    plt.plot(months, avg_high, marker='o', linestyle='-', color='#E74C3C', linewidth=2.5, label='平均最高气温')
    plt.plot(months, avg_low, marker='s', linestyle='-', color='#3498DB', linewidth=2.5, label='平均最低气温')

    # 填充两条线之间的区域
    plt.fill_between(months, avg_high, avg_low, color='#AED6F1', alpha=0.3)

    # 设置标题和标签
    plt.title('大连近三年月平均气温变化趋势 (2022-2024)', fontsize=16, pad=20)
    plt.xlabel('月份', fontsize=12)
    plt.ylabel('温度 (℃)', fontsize=12)

    # 设置x轴刻度
    month_names = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']
    plt.xticks(months, month_names)

    # 添加数据标签
    for x, y_high, y_low in zip(months, avg_high, avg_low):
        plt.text(x, y_high + 0.3, f'{y_high:.1f}℃', ha='center', va='bottom', fontsize=9)
        plt.text(x, y_low - 0.5, f'{y_low:.1f}℃', ha='center', va='top', fontsize=9)

    # 添加网格和图例
    plt.grid(True, linestyle='--', alpha=0.7)
    plt.legend(loc='upper right')

    # 调整布局
    plt.tight_layout()

    # 保存图像
    plt.savefig('../weather/images/dalian_monthly_temperature_trend.png', dpi=300)
    print("图表已保存为: ../weather/images/dalian_monthly_temperature_trend.png")

    # 显示图表
    plt.show()


if __name__ == '__main__':
    main()